
public class Test {
        // ThreadLocal = 每个线程自带一个独立抽屉，set() 放东西、get() 拿东西、remove() 清空；用完不清会把状态带到下次复用
        private static final ThreadLocal<String> CTX = new ThreadLocal<>();
        // ThreadLocal.withInitial(() -> 0);
        // 设置默认值

        public static void main(String[] args) {
                CTX.set("主线程数据");
                log(); // main 有数据

                new Thread(() -> {
                        CTX.set("子线程数据");
                        log(); // 子线程有数据
                        CTX.remove(); // 只清子线程
                }).start();

                try {
                        Thread.sleep(100);
                } catch (InterruptedException e) {
                }
                log(); // main 依旧有数据！
        }

        static void log() {
                System.out.println(Thread.currentThread().getName() + " 拿到: " + CTX.get());
        }
}